package service

import (
	"fmt"
	"gin-demo/dao"
	"gin-demo/model"
	"gin-demo/param"
	"gin-demo/tool"
	"math/rand"
	"strconv"
	"time"
)

type MemberService struct {
}

func (ms *MemberService) GetUserInfo(userId string) *model.Member {
	id, err := strconv.Atoi(userId)
	if err != nil {
		return nil
	}
	md := dao.MemberDao{Orm: tool.DbEngine}
	return md.QueryMemberById(id)
}

func (ms *MemberService) UploadAvatar(userId int64, fileName string) string {

	md := dao.MemberDao{Orm: tool.DbEngine}
	result := md.UpdateMemberAvatar(userId, fileName)
	if result == 0 {
		return ""
	}

	return fileName
}

func (ms *MemberService) Login(name, password string) *model.Member {

	// 1, 用户名 + 密码 查询,如果存在用户 直接返回
	md := dao.MemberDao{Orm: tool.DbEngine}
	memger := md.Query(name, password)
	if memger.Id != 0 {
		return memger
	}

	// 2, 用户不存在,作为新用户保存到数据库中
	user := model.Member{}
	user.UserName = name
	user.Password = tool.EncoderSha256(password)
	user.RegisterTime = time.Now().Unix()
	user.Id = md.InsertMember(user) // 保存

	return &user
}

func (ms *MemberService) SmsLogin(loginparam param.SmsLoginParam) *model.Member {

	// 1, 获取参数中的手机号码和验证码

	// 2, 验证手机号码+验证码是否正确(和数据库数据对比)
	md := dao.MemberDao{Orm: tool.DbEngine}
	sms := md.ValidateSmsCode(loginparam.Phone, loginparam.Code)
	if sms.Id == 0 {
		return nil
	}

	// 3, 根据手机号码查询 memger 表中是否有该记录
	member := md.QueryByPhone(loginparam.Phone)
	if member.Id != 0 { // 存在该条记录
		return member
	}

	// 4, 没有该手机号码的记录,就创建一条该手机号码的记录,保存
	user := model.Member{}
	user.UserName = loginparam.Phone
	user.Mobile = loginparam.Phone
	user.RegisterTime = time.Now().Unix()

	user.Id = md.InsertMember(user) // 保存

	return &user
}

func (ms *MemberService) Sendcode(phone string) bool {
	// 1. 生成验证码(4 位数的数字验证码)
	rnd := rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000)
	code := fmt.Sprintf("%06v", rnd) // %06v 表示后面 Int31n 中的参数, 1 后面有 6 个 0; %04v 表示后面 Int31n 中的参数, 1 后面有 4 个 0,

	// 将验证码保存到数据库
	smsCode := model.SmsCode{
		Phone:      phone,
		Code:       code,
		BizId:      "BizId",
		CreateTime: time.Now().Unix(),
	}

	memberDao := dao.MemberDao{
		Orm: tool.DbEngine,
	}
	result := memberDao.InsertCode(smsCode)

	return result > 0
	/*
		// 以下是连接阿里云的短信的发送验证码流程

		// 1. 生成验证码(4 位数的数字验证码)
		rnd := rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000)
		code := fmt.Sprintf("%06v", rnd) // %06v 表示后面 Int31n 中的参数, 1 后面有 6 个 0; %04v 表示后面 Int31n 中的参数, 1 后面有 4 个 0,
		// 获取我们的配置文件的数据
		config := tool.GetConfig().Sms

		// 2. 调用阿里云 SDK, 完成发送
		client, err := dysmsapi.NewClientWithAccessKey(config.RegionId, config.AppKey, config.AppSecret)
		if err != nil {
			log.Fatalln(err.Error())
			return false
		}
		request := dysmsapi.CreateSendSmsRequest()
		request.Scheme = "https"
		request.SignName = config.SignName
		request.TemplateCode = config.TemplateCode
		request.PhoneNumbers = phone
		par, err := json.Marshal(map[string]interface{}{
			"code": code,
		})
		request.TemplateParam = string(par)

		response, err := client.SendSms(request)
		fmt.Println("短信信息", response)
		if err != nil {
			log.Fatalln(err.Error())
			return false
		}

		// 判断短信验证码是否发送成功
		if response.Code == "OK" {
			// 将验证码保存到数据库
			smsCode := model.SmsCode{
				Phone:      phone,             // "15423698"
				Code:       code,              // "223556"
				BizId:      response.BizId,    // "BizId"
				CreateTime: time.Now().Unix(), // "1635694801"
			}

			memberDao := dao.MemberDao{
				Orm: tool.DbEngine,
			}
			result := memberDao.InsertCode(smsCode)

			return result > 0
		}

		// 3. 接收返回结果,并判断发送状态

		return false
	*/
}
